Випадкові числа. Рандом

Рандом - це деякі випадкові події, які відбуваються в грі або в програмі, у них немає запрограмованого часу або порядку активації, тобто їх поява передбачити просто неможливо. Випадкові числа - це числа, які з'являються випадково за певним алгоритмом. Поглянемо на реалізацію в Python

In [1]:
import random 

number = random.randrange(0,5) # проміжок чисел від 0 до 5, проте 5 НЕ ВКЛЮЧЕНА
print(number)
3

Функція random.randrange(0,5) повертає рандомне число від 0 до 5

Завдання 1: вивести рандомне число від 0 до 100 на консоль

(1 бал) (5 хв)

Завдання 2: написати гру рандомні числа. Користувач вводить число з клавіатури від 0 до 10, 10 включно. Потім генерується рандомне число і порівнюється з тим, що ввів користувач. Якщо вони збігаються то вивести "You Win!", якщо ні - "You Lose!".

(2 бали) (10 хв)

Для тих хто впорався швидше є додаткове завдання. В завданні номер 2 додати перевірку на введене число з клавіатури, щоб воно було в проміжку від 0 до 10, якщо воно не таке, то вивести "Please enter number again".

-------------------------------------------------------------------------------------------------------------

Модуль числа. Або відстань від точки до точки

%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%BD%D1%8F.png

Модулем числа називають відстанню між 2 точками. В іграх це може бути відстань між ворогами, вашим персонажем і ворогами, будь-яка відстань на карті між 2 об'єктами

Функція abs робить з від'ємного числа, додатне число

In [2]:
marioCoordinates = -50
print(marioCoordinates)
print(abs(marioCoordinates))
-50
50

Завдання 3: є два числа: -50 та 100. Відняти ці два числа та взяти модуль від їх різниці. Перевірити чи число, яке у вас вийшло є додатним. Вивести "Число додатне" у випадку додатності, якщо ж у вас вийшло від'ємне число, то завдання виконано неправильно.

(1 бал) (5 хв)

-------------------------------------------------------------------------------------------------------------

Перша гра "Ping Pong"

In [21]:
from random import choice, random
from turtle import *
from freegames import vector

def value():
    "Randomly generate value between (-5, -3) or (3, 5)."
    return (3 + random() * 2) * choice([1, -1])

# початкові координати появи м'яча
ball = vector(0, 0)
# м'яч має рандомний напрямок, який генерується з функції value
aim = vector(value(), value())
state = {1: 0, 2: 0}

def move(player, change):
    "Move player position by change."
    state[player] += change

def rectangle(x, y, width, height):
    "Draw rectangle at (x, y) with given width and height."
    up()
    goto(x, y)
    down()
    begin_fill()
    for count in range(2):
        forward(width)
        left(90)
        forward(height)
        left(90)
    end_fill()

def draw():
    "Draw game and move pong ball."
    clear()
    rectangle(-200, state[1], 10, 50)
    rectangle(190, state[2], 10, 50)

    ball.move(aim)
    x = ball.x
    y = ball.y

    up()
    goto(x, y)
    # розмір м'яча
    dot(10)
    update()
    # границі
    if y < -200 or y > 200:
        aim.y = -aim.y

    if x < -185:
        low = state[1]
        high = state[1] + 50

        if low <= y <= high:
            aim.x = -aim.x
        else:
            return

    if x > 185:
        low = state[2]
        high = state[2] + 50

        if low <= y <= high:
            aim.x = -aim.x
        else:
            return
    # швидкість руху м'яча
    ontimer(draw, 100)

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
listen()
# клавіші управління
onkey(lambda: move(1, 20), 'w')
onkey(lambda: move(1, -20), 's')
onkey(lambda: move(2, 20), 'i')
onkey(lambda: move(2, -20), 'k')
draw()
done()

Завдання 4: в Ping Pong змінити:

- клавіші управління на ті, які вам зручні.

- змінити швидкість руху м'яча на повільнішу в 2 рази.

- змінити розмір м'яча на 20.

- змінити початкові координати появи м'яча.

- ті хто виконав всі попередні пункти можуть просто експериментувати з грою, та міняти якісь значення :D

(2 бали) (20 хв)

-------------------------------------------------------------------------------------------------------------

Друга гра "Змійка на двох" або "Tron"

In [17]:
from turtle import *
from freegames import square, vector

# перший гравець
# початкова точка
p1xy = vector(-100, 0)
# напрямок
p1aim = vector(4, 0)
p1body = set()

# другий гравець
# початкова точка
p2xy = vector(100, 0)
# напрямок
p2aim = vector(-4, 0)
p2body = set()

# чи ми знаходимся в межах карти
def inside(head):
    "Return True if head inside screen."
    return -200 < head.x < 200 and -200 < head.y < 200

def draw():
    "Advance players and draw game."
    # рух гравця 1
    p1xy.move(p1aim)
    p1head = p1xy.copy()
    
    # рух гравця 2
    p2xy.move(p2aim)
    p2head = p2xy.copy()

    # перевірка чи гравець 1 врізався в гравця 2
    if not inside(p1head) or p1head in p2body:
        print('Player blue wins!')
        return

    # перевірка чи гравець 2 врізався в гравця 1
    if not inside(p2head) or p2head in p1body:
        print('Player red wins!')
        return

    # збільшення тіла гравця 1
    p1body.add(p1head)
    # збільшення тіла гравця 2
    p2body.add(p2head)

    # вигляд обох гравців, цифра 3 означає розмір, а колір можна міняти
    square(p1xy.x, p1xy.y, 3, 'red')
    square(p2xy.x, p2xy.y, 3, 'blue')
    update()
    # швидкість руху гравців
    ontimer(draw, 50)

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
listen()
onkey(lambda: p1aim.rotate(90), 'a')
onkey(lambda: p1aim.rotate(-90), 'd')
onkey(lambda: p2aim.rotate(90), 'j')
onkey(lambda: p2aim.rotate(-90), 'l')
draw()
done()

Завдання 5: в Tron змінити:

- клавіші управління на зручні для вас, зрозуміти та могти пояснити чому там написано rotate(90).

- змінити швидкість руху гравців на 100.

- змінити колір одного з гравців.

- змінити початкові координати появи першого гравця.

(1 бал) (30 хв)

Завдання 6 (важкий рівень): в Tron додати третього гравця. Додати для нього клавіші управління та колір black. Не робити перевірку на те, чи він врізався в інших, або інші в нього.

(1 бал) (20 хв)

-------------------------------------------------------------------------------------------------------------

ПЕЕЕЕЕРЕЕЕЕРВА

%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%BD%D1%8F.png

Третя гра "Packman"

Перед запуском цієї гри потрібно нажимати сюди. Оскільки вона некоректно запускається в Jupyter Notebook, який зберігає попередні запуски

%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%BD%D1%8F.png

%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%BD%D1%8F.png

In [1]:
from random import choice
from turtle import *
from freegames import floor, vector

# рахунок
state = {'score': 0}
path = Turtle(visible=False)
writer = Turtle(visible=False)
# напрямок
aim = vector(5, 0)
# початкові координати пекмена
pacman = vector(-40, -80)
# вороги
ghosts = [
    [vector(-180, 160), vector(5, 0)],
    [vector(-180, -160), vector(0, 5)],
    [vector(100, 160), vector(0, -5)],
    [vector(100, -160), vector(-5, 0)],
]
# карта, 0 - це стіна, 1 - це дорога
tiles = [
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
    0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
    0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0,
    0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]

def square(x, y):
    "Draw square using path at (x, y)."
    path.up()
    path.goto(x, y)
    path.down()
    path.begin_fill()

    for count in range(4):
        path.forward(20)
        path.left(90)

    path.end_fill()

def offset(point):
    "Return offset of point in tiles."
    x = (floor(point.x, 20) + 200) / 20
    y = (180 - floor(point.y, 20)) / 20
    index = int(x + y * 20)
    return index

def valid(point):
    "Return True if point is valid in tiles."
    index = offset(point)

    if tiles[index] == 0:
        return False

    index = offset(point + 19)

    if tiles[index] == 0:
        return False

    return point.x % 20 == 0 or point.y % 20 == 0

def world():
    "Draw world using path."
    bgcolor('black')
    path.color('blue')

    for index in range(len(tiles)):
        tile = tiles[index]

        if tile > 0:
            x = (index % 20) * 20 - 200
            y = 180 - (index // 20) * 20
            square(x, y)

            if tile == 1:
                path.up()
                path.goto(x + 10, y + 10)
                # розмір їжі та її колір
                path.dot(2, 'white')

def move():
    "Move pacman and all ghosts."
    writer.undo()
    writer.write(state['score'])

    clear()

    if valid(pacman + aim):
        pacman.move(aim)

    index = offset(pacman)

    if tiles[index] == 1:
        tiles[index] = 2
        state['score'] += 1
        x = (index % 20) * 20 - 200
        y = 180 - (index // 20) * 20
        square(x, y)

    up()
    goto(pacman.x + 10, pacman.y + 10)
    # розмір пекмена та його колір
    dot(20, 'yellow')

    for point, course in ghosts:
        if valid(point + course):
            point.move(course)
        else:
            options = [
                vector(5, 0),
                vector(-5, 0),
                vector(0, 5),
                vector(0, -5),
            ]
            plan = choice(options)
            course.x = plan.x
            course.y = plan.y

        up()
        goto(point.x + 10, point.y + 10)
        # розмір ворогів та їх колір
        dot(20, 'red')

    update()

    for point, course in ghosts:
        if abs(pacman - point) < 20:
            return

    ontimer(move, 100)

def change(x, y):
    "Change pacman aim if valid."
    if valid(pacman + vector(x, y)):
        aim.x = x
        aim.y = y

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
writer.goto(160, 160)
writer.color('white')
writer.write(state['score'])
listen()
onkey(lambda: change(5, 0), 'Right')
onkey(lambda: change(-5, 0), 'Left')
onkey(lambda: change(0, 5), 'Up')
onkey(lambda: change(0, -5), 'Down')
world()
move()
done()

Завдання 7: пограти в Packman 10 хвилин.

Завдання 8: розібрати код гри. Поміняти ігрове поле на своє. Пам'ятаємо 0 - це стіна, 1 - це дорога.

Завдання 9:

- в список привидів (ворогів) додати ще 20 привидів та спробувати зіграти.

- змінити колір пекмена на будь-який інший.

- змінити колір ворогів на будь-який інший.

(1 бал) (40 хв)

Завдання 10: згенерувати карту рандомно. З допомогою функції random.randrange(0,2) написати фукнцію get_r(), яка повертатиме рандомно число 0 або 1. Викликати цю функцію при створенні вашої карти.

Це завдання творче, тому ви можете робити як повністю рандомну карту, так і мікс з готовою. Важливою умовою є те, щоб в гру можна було після цього грати та ні packman, ні привиди не застрягли в текстурах.

(1 бал) (20 хв)